Вектор - это, пожалуй, наиболее часто используемый термин 3D графики. Чтобы создать хотя бы
мало-мальски крупный 3D проект необходимо уметь пользоваться этими щтуковинами. В этом разделе
будут рассмотрены основные операции над векторами, их свойства и использование.
Итак, чтоже такое вектор? Все очень просто, вектор - это направленный отрезок, имеющий начало и конец.
В 3D графике используют вектора начинающиеся в точке с координатами (0, 0, 0). Векторами обычно обозначают
скорость предметов или силы действующие на них. Вектор обладает двумя характеристиками: длина и направление.
Чаще используют единичные вектора, т.е вектора с длиной равной единице. Простейшим способом включения
векторов в вашу программу является введение следующей конструкции:
typedef struct
{
float x, y, z;
} VECTOR;
Но если ограничиться лишь этой структурой, то использование векторов потеряет всякий смысл: все
преимущество использования векторов заключается в возможности ими манипулировать. Далее описаны
операции, которые можно производить с векторами.
Ч
Определение модуля.
Ш
Также эту операцию называют Magnitude или Length, но в любом случае все это значит одно и то же - определение
расстояния между начальной и конечной точками. А так как вектор начинается в точке (0, 0, 0), достаточно
найти расстояние от конечной точки до начала координат.
|a|2 = x2 + y2 + z2
Ч
Нормализация.
Ш
Приводит вектор к единичному. Т.е длина вектора становится равна единице. Эта операция важна для
использования некоторых операций, описанных далее.
ax = bx/ |b|
ay = by/ |b|
az = bz/ |b|
Ч
Отрицание.
Ш
Меняет направление вектора на противоположное. На рисунке -a = b.
ax = -ax
ay = -ay
az = -az
Ч
Сложеие.
Ш
Результат сложения - на картинке. a + b = c. Сложение векторов может использоваться для определения
результируещей силы, действующий на объект. Например, в одного человечка с двух разных сторон
врезаются машинки... Куда полетит человечек? Сложим векторы скоростей машинок - узнаем.
cx = ax+bx
cy = ay+by
cz = az+bz
Ч
Вычитание.
Ш
Почти то же самое, что и сложение, только к первому вектору прибавляется вектор, обратный второму.
Итог на картинке. a - b = c. Используется обычно для привязки системы координат к какому-нибудь
движущемуся объекту, тогда вектор относительной скорости любого другого объекта
будет равен разности вектора абсолютной скорости и вектора скорости того самого движущегося
объекта.
cx = ax-bx
cy = ay-by
cz = az-bz
Ч
Умножение на константу.
Ш
Длина вектора увеличивается в k раз. На рисунке b = k * a.
bx = k*ax
by = k*ay
bz = k*az
Ч
Скалярное произведение.
Ш
Англоязычный вариант этого термина звучит, как DotProduct. Итогом операции является число равное
|a|*|b|*cos(alpha), где |a| и |b| длины умножаемых векторов, а cos(alpha) косинус угла между ними.
Важным свойством операции является то, что если оба вектора единичны, то в результате получится
просто cos(alpha). Если же единичен лишь один из них, то получится длина проекции другого на
прямую, образуемую единичным.
a ^ b = ax*bx + ay*by +
az*bz
Ч
Векторное произведение.
Ш
Англоязычный вариант этого термина звучит, как CrossProduct.
Итогом операции является вектор перпендикулярный плоскости, образуемой перемножаемыми векторами.
Операция используется для определения направления нормали, о которых рассказано в разделе
"плоскости"; для определения координат многоугольников перпендикулярных направлению камеры,
которые используются для создания спецэфектов; и для многого другого.
cx = ay*bz - az*by
cy = az*bx - ax*bz
cz = ax*by - ay*bx
Чтобы использовать все перечисленные операции необходимо создать для векторов специальный класс.
Я написал пример такого класса.